package com.yuanqiao.insight.modules.download.listener;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.yuanqiao.insight.common.util.common.LocalCacheUtils;
import com.yuanqiao.insight.modules.download.entity.UtlDownloadManage;
import com.yuanqiao.insight.modules.download.service.IUtlDownloadManageService;
import com.yuanqiao.insight.modules.notice.entity.SysNoticeTemplate;
import com.yuanqiao.insight.modules.notice.service.ISysNoticeTemplateService;
import com.yuanqiao.insight.system.config.emus.NoticeType;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import com.insight.common.mq.RedisMq;
import com.insight.common.mq.aspect.annotation.RedisMessageExtend;
import com.insight.common.mq.stream.Streams;
import com.insight.common.mq.utils.AnalyzeContent;
import com.insight.common.system.vo.LoginUser;
import com.insight.modules.system.entity.SysPermission;
import com.yuanqiao.insight.acore.system.service.ISysDictService;
import com.insight.modules.system.service.ISysPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;
import java.util.Optional;

/**
 * 生成下载记录
 *
 * @author JinPengDong
 * @date 2023/5/9
 */
@Slf4j
@Component
public class GenerateDownloadInfoListener implements StreamListener<String, MapRecord<String, String, String>> {

    @Autowired
    private ISysNoticeTemplateService noticeTemplateService;   // 消息通知模板服务
    @Autowired
    private IUtlDownloadManageService downloadManageService;   // 下载管理服务
    @Autowired
    private ISysPermissionService sysPermissionService;        // 权限服务（用于查询模块信息）
    @Autowired
    private ISysDictService dictService;                        // 字典服务（用于查询字典项文本）
    @Autowired
    private RedisMq redisMq;                                    // Redis 消息发布服务
    private static final LocalCacheUtils cacheUtils = LocalCacheUtils.getInstance();  // 本地缓存工具单例

    /**
     * 监听 Redis Stream 中 GENERATE_DOWNLOAD_INFO 事件消息的处理方法
     *
     * @param message 消息体，包含下载相关的信息
     */
    @Override
    @Async("stream-core-pool") // 异步线程池处理，避免阻塞
    @RedisMessageExtend(stream = Streams.GENERATE_DOWNLOAD_INFO) // 自定义注解，指定监听的 Redis Stream
    public void onMessage(MapRecord<String, String, String> message) {
        // 解析消息内容
        final Map<String, String> value = message.getValue();
        JSONObject data = AnalyzeContent.getContent(value);

        // 获取权限标识（URL 或权限标识符）
        String permission = data.getString("permission");
        // 原始文件名
        String originFileName = data.getString("originFileName");
        // 文件路径（存储路径或URL）
        String filePath = data.getString("filePath");
        // 文件大小（字节数）
        Long fileSize = Long.valueOf(data.getString("fileSize"));

        // 根据权限标识查询权限实体
        SysPermission sysPermission = sysPermissionService.queryByUrl(permission);

        // 文件路径不为空，才处理
        if (ObjectUtils.isNotEmpty(filePath)) {
            UtlDownloadManage utlDownloadManage = new UtlDownloadManage();
            utlDownloadManage.setRequestTime(new Date()); // 设置请求时间为当前时间

            // 构造模块名称（平台类型+上级权限名称+权限名称）
            String moduleName = "";
            if (sysPermission.getPlatformType() != null) {
                // 通过字典查询平台类型对应的文字描述
                moduleName = dictService.queryDictTextByKey("platform_type", String.valueOf(sysPermission.getPlatformType()));
            }
            if (StringUtils.isNotEmpty(sysPermission.getParentId())) {
                // 查询上级权限名称并拼接
                SysPermission sysPermission1 = sysPermissionService.queryByPerId(sysPermission.getParentId());
                moduleName += "_" + sysPermission1.getName();
            }
            // 拼接当前权限名称
            moduleName += moduleName + "_" + sysPermission.getName();

            utlDownloadManage.setModuleName(moduleName);
            // 设置文件名，优先使用原始文件名，否则使用文件路径作为文件名
            utlDownloadManage.setFileName(Optional.ofNullable(originFileName).orElse(filePath));
            utlDownloadManage.setFileUrl(filePath);
            // 文件大小单位转换为KB存储
            utlDownloadManage.setFileSize(fileSize / 1024);
            // 机构编码字段留空，可能后续扩展使用
            utlDownloadManage.setSysOrgCode("");

            // 创建者信息
            String createBy = data.getString("createBy");
            utlDownloadManage.setCreateBy(createBy);

            // 保存下载记录到数据库
            downloadManageService.save(utlDownloadManage);

            // 组装通知消息体，准备发送站内通知
            final String upDownTemplate = String.valueOf(cacheUtils.getValueByKey("data_dict_key_up_down_template"));
            // 从缓存或数据库中获取通知模板
            final SysNoticeTemplate noticeTemplate = noticeTemplateService.getById(upDownTemplate);
            JSONObject template = JSONObject.parseObject(noticeTemplate.getTemplate());

            // 填充通知模板参数
            JSONObject par = new JSONObject();
            par.put("moduleName", moduleName);
            par.put("fileName", filePath);
            par.put("fileSize", utlDownloadManage.getFileSize() + "KB");
            template.put("par", par);

            // 设置通知标题
            template.put("title", "下载完成：" + filePath);

            // 组装最终消息体
            JSONObject msgData = new JSONObject();
            msgData.put("support", NoticeType.STATION_NOTICE.getCode()); // 站内通知类型
            msgData.put("sendMsg", new JSONObject());                   // 发送消息内容，此处空对象
            msgData.put("template", template);                           // 模板内容
            msgData.put("isPar", true);                                  // 是否传参标记

            // 通过Redis发布通知消息到指定频道
            redisMq.publish(Streams.NOTICE, msgData);
        }
    }
}

